const WebSocket = require('ws');

/**
 * 聊天处理类
 * 
 * 1. 创建聊天WebSocket服务器
 * 2. 处理客户端连接
 * 3. 处理聊天消息
 * 4. 处理客户端断开连接
 * 5. 广播消息
 * 6. 获取服务器实例
 * 
 * 
 */
class ChatHandler {
    //构造函数
    constructor() {
        this.chatWss = new WebSocket.Server({ noServer: true }); //创建聊天WebSocket服务器
        this.setupChatHandler(); //设置聊天处理,自定义方法
    }

    //设置聊天处理
    setupChatHandler() {
        this.chatWss.on('connection', (ws, request) => {
            //ws 是 WebSocket连接实例对象，它是每个客户端与服务器建立的WebSocket连接的代表
            // request是请求对象，包含请求的头部信息，如origin、referer等

            //连接成功执行一下函数
            console.log(`聊天客户端${request?.headers?.origin}已连接聊天服务器`);
            ws.send(JSON.stringify({ type: 'welcome', message: '欢迎来到聊天室' })); //发送欢迎消息
            ws.wsType = 'chat'; //设置客户端连接对象的类型
            
            ws.on('message', (message) => {   //监听客户端发送的消息
                try {
                    const data = JSON.parse(message); //解析消息
                    this.handleChatMessage(ws, data); //处理聊天消息函数  ws是客户端连接对象，data是消息对象
                } catch (error) { //捕获错误
                    ws.send(JSON.stringify({ type: 'error', message: '消息格式错误' })); //发送错误消息
                }
            });

            ws.on('close', (code, reason) => { //监听客户端断开连接  code是关闭代码，reason是关闭原因,由客户端发送
                console.log(`聊天客户端${request?.headers?.origin}断开连接: ${code} - ${reason}`);
                this.handleClientDisconnect(ws); //处理客户端断开连接函数  ws是客户端连接对象
            });

            // 定时发送消息
            const intervalId = setInterval(() => {
                if (ws.readyState === WebSocket.OPEN) {
                    ws.send(JSON.stringify({ type: 'message', message: '这是一条定时消息' }));
                } else {
                    clearInterval(intervalId);
                }
            }, 3000);

            // 保存定时器ID，以便在断开时清理
            ws.chatIntervalId = intervalId;
        });
    }

    //处理聊天消息
    handleChatMessage(ws, data) {
        console.log(`收到聊天消息: ${JSON.stringify(data)}`);
        ws.send(JSON.stringify({ type: 'message', message: `服务端接受消息${JSON.stringify(data)}` }));
    }

    //处理客户端断开连接
    handleClientDisconnect(ws) {
        // 清理定时器
        if (ws.chatIntervalId) {
            clearInterval(ws.chatIntervalId);
        }
        
       console.log(`聊天客户端${ws.request?.headers?.origin}断开连接`);
    }

    //获取服务器实例
    getServer() {
        return this.chatWss;
    }
}

//导出ChatHandler类
module.exports = ChatHandler;